package com.itmayiedu.utils;

import com.itmayiedu.base.ReceiveXmlModel;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;

/**
 * @Author cht 【wonderfor@vip.qq.com】
 * @Date 2018/10/25
 */
@Slf4j
public class ReceiveXmlProcess {
    /**
     * 解析微信xml消息
     * @param strXml
     * @return
     */
    public static ReceiveXmlModel getMsgEntity(String strXml) {
        ReceiveXmlModel msg = null;
        try {
            if (StringUtils.isEmpty(strXml))
                return null;

            // 将字符串转化为XML文档对象
            Document document = DocumentHelper.parseText(strXml);
            // 获得文档的根节点
            Element root = document.getRootElement();
            // 遍历根节点下所有子节点
            Iterator<?> iter = root.elementIterator();

            // 遍历所有结点
            msg = new ReceiveXmlModel();
            //利用反射机制，调用set方法
            //获取该实体的元类型
            Class<?> c = Class.forName("com.itmayiedu.base.ReceiveXmlModel");
            msg = (ReceiveXmlModel)c.newInstance();//创建这个实体的对象

            while(iter.hasNext()){
                Element ele = (Element)iter.next();
                //获取set方法中的参数字段（实体类的属性）
                Field field = c.getDeclaredField(ele.getName());
                //获取set方法，field.getType())获取它的参数数据类型
                Method method = c.getDeclaredMethod("set"+ele.getName(), field.getType());
                //调用set方法
                method.invoke(msg, ele.getText());
            }
        } catch (Exception e) {
            log.error("ReceiveXmlModel read xml error: "+ strXml);
            e.printStackTrace();
        }
        return msg;
    }
}
